<?php

/**
 *
 * Le Controller pour la section vente.
 * @author Th�o Chamley
 *
 */

class VenteController extends CodeBar_AbstractController {

	protected $_redirector = null;
	
	/**
	 * (non-PHPdoc)
	 * @see trunk/library/Zend/Controller/Zend_Controller_Action::init()
	 */
	public function init() {
		CodeBar_AbstractController::init();
		if(!($this->session()->user->connected)) {
			$this->_helper->redirector('index');
		} else if($this->session()->permissionactive != "Vente") {
			$this->_helper->redirector('PermissionChoice', 'index');
		}
		$this->_redirector = $this->_helper->getHelper('Redirector');
	}

	/**
	 *
	 * Page de vente
	 */
	public function indexAction() {
		$this->jQueryDisable();
		$this->view->headTitle("Vente");
		/*
		 * JS
		 */
		$this->view->headScript()->appendFile('/js/vente.js', 'text/javascript');
		$this->view->headScript()->appendFile('/js/popup.js', 'text/javascript');

		/*
		 * CSS
		 */
		$this->view->headLink()->appendStylesheet('/css/stylesheet_vente.css');
		$this->view->headLink()->appendStylesheet('/css/main/main.css');

		//Notre formulaire
		$form = new Application_Form_VenteForm();

		//Gestion de la vente après le post du formulaire
		if($this->getRequest()->isPost()) {
			$formdata=$this->getRequest()->getPost();
			if($form->isValid($formdata)) {
				//récupération des informations du form
				$total = $form->getValue('total');
				$type_vente = $form->getValue('type');
				$client = $form->getValue('login');
				$sp = $form->getValue('selected_products');
				$selected_products = array();
				$sq = $form->getValue('selected_qqties');
				$selected_qqties = array();
				$element = NULL;


				try {
					//Throw une exception si le $client est vide.
					$client_obj = Application_Model_User::getByLogin($client);

					//On vérifie que le solde est suffisant pour la vente
					if($client_obj->getSolde() < $total) {
						echo "<script language=\"javascript\">";
						echo "alert(\"Solde insuffisant !";
						echo "\")</script>";
					} else {
						//Cette boucle récupère les id des produits vendus
						for($i = 0;$i < mb_strlen($sp); $i++) {
							if($sp[$i] != ',')
							{
								$element = $element.$sp[$i];
							} else {
								$selected_products[] = $element;
								$element = NULL;
							}
						}
						$selected_products[] = $element;
						$element = NULL;

						//Cette boucle récupère les quantités des produits vendus
						for($i = 0;$i < mb_strlen($sq); $i++) {
							if($sq[$i] != ',') {
								$element = $element.$sq[$i];
							} else {
								$selected_qqties[] = $element;
								$element = NULL;
							}
						}
						$selected_qqties[] = $element;
						$element = NULL;
						//fin de récupèration des éléments du form

						try {
							//Cette boucle exécute la vente des différents produits
							//Le hack pour le multi-débit intervient dans la méthode vente
							//Si un multi-débit a lieu,  il y a une exception
							for($i = 0; $i < count($selected_products); $i++) {
								$product = new Application_Model_Produit();
								$product->getById($selected_products[$i]);
								$product->vente($selected_qqties[$i], $client, $type_vente);
							}
						} catch(Zend_Exception $e) {
							$this->view->error = $e->getMessage();
						}
					}
				} catch(Zend_Exception $e) {// If the client is null then, we do a cash sell.
					//Cette boucle récupère les id des produits vendus
					for($i = 0; $i < mb_strlen($sp); $i++) {
						if($sp[$i] != ',')
						{
							$element = $element.$sp[$i];
						} else {
							$selected_products[] = $element;
							$element = NULL;
						}
					}
					$selected_products[] = $element;
					$element = NULL;

					//Cette boucle récupère les quantités des produits vendus
					for($i = 0; $i < mb_strlen($sq); $i++) {
						if($sq[$i] != ',') {
							$element = $element.$sq[$i];
						} else {
							$selected_qqties[] = $element;
							$element = NULL;
						}
					}
					$selected_qqties[] = $element;
					$element = NULL;
					//fin de récupèration des éléments du form

					try {
						/*
						 * Cette boucle exécute la vente des différents produits
						 * Le hack pour le multi-débit intervient dans la méthode vente
						 * Si un multi-débit a lieu, il y a une exception.
						 * A priori, le bug n'a plus lieu grace à la redirection
						 * 303 qui intervient juste en dessous.
						 */
						for($i = 0; $i<count($selected_products); $i++) {
							$product = new Application_Model_Produit();
							$product->getById($selected_products[$i]);
							$product->vente($selected_qqties[$i], null, $type_vente);
						}
					} catch(Zend_Exception $e) {
						$this->view->error = $e->getMessage();
					}
				}
				/*
				 * To correct the "multi-débits" bug.
				 * Once the sell is done, the user is redirected
				 * on the same page, but this time with a GET instead
				 * of a POST. This way, even by reloading the page
				 * the sell will not happen twice.
				 * See: http://www.theserverside.com/news/1365146/Redirect-After-Post
				 */
				$this->redirect();
				$this->_redirector->setCode(303)
							->setExit(false)
							->setGotoSimple('index', 'vente');
				$this->_redirector->redirectAndExit();
			}
		}
		$form = new Application_Form_VenteForm();
		$this->view->form = $form;
	}

	/**
	 *
	 * Action à usage interne pour récupérer les infos sur les produits du groupe
	 */
	public function recupprodAction()
	{
		//Ce layout est vide
		$this->_helper->viewRenderer->setNoRender();
		$this->_helper->layout->disableLayout();
		$groupe = $this->session()->user->getGroupeActif();

		//Affiche (pour r�cup�ration par JS) la liste des ids des produits du groupe
		$liste_id_produits = $groupe->getListeIdProduits();
		echo "produits_id = Array('".$liste_id_produits[0];
		for($i = 1;$i<count($liste_id_produits);$i++)
		{
			echo "', '".$liste_id_produits[$i];
		}
		echo "');\n";

		//Affiche (pour r�cup�ration par JS) dans quel type va chaque produit
		$liste_folder_produits = $groupe->getListeFolderProduits();
		echo "prod_folder = Array('".$liste_folder_produits[0];
		for($i = 1;$i<count($liste_folder_produits);$i++)
		{
			echo "','".$liste_folder_produits[$i];
		}
		echo "');\n";

		//Affiche (pour r�cup�ration par JS) la liste des noms des produits du groupe
		$liste_nom_produits = $groupe->getListeNomProduits();
		echo "produits = Array('".$liste_nom_produits[0];
		for($i = 1;$i<count($liste_nom_produits);$i++)
		{
			echo "','".str_replace("'","\'",$liste_nom_produits[$i]);
		}
		echo "');\n";

		//Affiche (pour r�cup�ration par JS) la liste des prix codebar
		$liste_prix = $groupe->getListePrix();
		echo "prix_cb = Array('".$liste_prix[0];
		for($i = 1;$i<count($liste_prix);$i++)
		{
			echo "','".$liste_prix[$i];
		}
		echo "');\n";

		//Affiche (pour r�cup�ration par JS) la liste des prix esp�ce
		$liste_prix_espece = $groupe->getListePrixEspece();
		echo "prix = Array('".$liste_prix_espece[0];
		for($i = 1;$i<count($liste_prix_espece);$i++)
		{
			echo "','".$liste_prix_espece[$i];
		}
		echo "');\n";

		//Affiche (pour r�cup�ration par JS) la liste des prix sp�ciaux
		$liste_prix_special = $groupe->getListePrixSpecial();
		echo "prix_special = Array('".$liste_prix_special[0];
		for($i = 1;$i<count($liste_prix_special);$i++)
		{
			echo "','".$liste_prix_special[$i];
		}
		echo "');\n";

		//Affiche (pour r�cup�ration par JS) la liste des types de produits
		$liste_folders = $groupe->getListeFolders();
		echo "folders = Array('".$liste_folders[0]."'";
		for($i = 1;$i<count($liste_folders);$i++)
		{
			echo ",'".$liste_folders[$i]."'";
		}
		echo ");\n";

		//Affiche (pour r�cup�ration par JS) la liste des ids des types de produits
		$liste_folders_id = $groupe->getListeFoldersId();
		echo "folders_id = Array('".$liste_folders_id[0];
		for($i = 1;$i<count($liste_folders_id);$i++)
		{
			echo "', '".$liste_folders_id[$i];
		}
		echo "');\n";

		//Gestion des best-sellers
		if($groupe->getBSAuto())
		{
			$groupe->setListeBSAuto()->saveListeBS();
		}
		$best_sellers = $groupe->getListeBS();
		if(count($best_sellers)>0)
		{
			echo "best_sellers = Array('".$best_sellers[0];
			for($i = 1;$i<count($best_sellers);$i++)
			{
				echo "', '".$best_sellers[$i];
			}
			echo "');\n";
		}
		else
		{
			echo "best_sellers = Array();";
		}
	}

	/**
	 *
	 * Action � usage interne pour g�rer une vente et r�cup�rer les informations associ�es � un code-barres
	 */
	public function infocodebarresAction()
	{
		$this->_helper->viewRenderer->setNoRender();
		$this->_helper->layout->disableLayout();
		$groupe = $this->session()->user->getGroupeActif();

		//La page est appel�e avec AJAX, en GET
		if($this->getRequest()->isGet())
		{
			$cb_found = false;
			$codebar = trim(strtolower($this->getRequest()->getParam('codebar')));
			$vente_login = $this->getRequest()->getParam('vente_login');
				
			//Premi�re section : vente par login
			if($vente_login)
			{
				//Si la vente est une vente par login, on v�rifie que le code du groupe est bon
				$password_groupe = $this->getRequest()->getParam('code');
				$code = $groupe->getCode();
				if($password_groupe != $code)
				{
					echo "alert('Pass du groupe erron�.');";
				}

				//Si le codebar est un num�ro (pas un login)
				else if(is_numeric($codebar))
				{
					$carte = new Application_Model_Carte();
						
					//On r�cup�re la carte associ�e au code barres. Il se peut qu'il n'y en ai pas au cas où ce soit
					//le code barres d'un produit. Dans ce cas l� l'id de la carte sera 0.
					$carte = $carte->getById($codebar);
					//Si on a bien affaire � une carte et pas � un produit
					if($carte->getId() != 0)
					{
						//Si la carte n'est pas bloqu�e
						if($carte->getActif())
						{
							try
							{
								$user = new Application_Model_User();
								//On r�cup�re l'user � partir de sa carte. Si l'user a chang� de carte alors on peut
								//lancer une exception. Normalement �a n'arrive pas (la carte est d�sactiv�e si l'user
								//change de carte)
								$user = $user->getById_Carte($carte->getId());
								//On fait appel au fonctions JS correspondantes
								echo "scanning_codebar('".$user->getLogin()."',".$user->getSolde().");";
								echo "document.getElementById('type').value = 1;";
							}
							catch(Zend_Exception $e)
							{
								echo "alert('Cette carte n'est plus attribu�e !');";
							}
						}
						else
						{
							echo "alert('Carte bloqu�e !');";
						}
						$cb_found = true;
					}
				}
				//Si le codebar est un login
				else
				{
					try
					{
						$user = Application_Model_User::getByLogin($codebar);
						$carte = new Application_Model_Carte();
						$carte = $carte->getById($user->getIdCarte());
						if($carte->getActif())
						{
							echo "scanning_codebar('".$user->getLogin()."',".$user->getSolde().");";
							echo "document.getElementById('type').value = 1;";
							$cb_found = true;
						}
						else
						{
							echo "alert('Carte bloqu�e !');";
							$cb_found = true;
						}
					}
					catch(Zend_Exception $e) {}
				}
			}
			//m�me chose si la douchette a �t� utilis�e
			else
			{
				if(is_numeric($codebar))
				{
					$carte = new Application_Model_Carte();
					try
					{
						$carte = $carte->getById($codebar);
						if($carte->getId() != 0)
						{
							if($carte->getActif())
							{
								try
								{
									$user = new Application_Model_User();
									$user = $user->getById_Carte($carte->getId());
									echo "scanning_codebar('".$user->getLogin()."',".$user->getSolde().");";
									echo "document.getElementById('type').value = 1;";
								}
								catch(Zend_Exception $e)
								{
									echo "alert('Cette carte n'est plus attribu�e !');";
								}
							}
							else
							{
								echo "alert('Carte bloqu�e !');";
							}
							$cb_found = true;
						}
					}
					catch(Zend_Exception $e){}
				}
				else
				{
					try
					{
						$user = new Application_Model_User();
						$user = Application_Model_User::getByLogin($codebar);
						$carte = new Application_Model_Carte();
						$carte = $carte->getById($user->getIdCarte());
						if($carte->getActif())
						{
							echo "scanning_codebar('".$user->getLogin()."',".$user->getSolde().");";
							echo "document.getElementById('type').value = 1;";
							$cb_found = true;
						}
						else
						{
							echo "alert('Carte bloqu�e !');";
							$cb_found = true;
						}
					}
					catch(Zend_Exception $e)
					{
					}
				}
			}
			//si on a pas trouv� de compte correspondant, alors le code barres est celui d'un produit
			if(!$cb_found)
			{
				try
				{
					$produit = new Application_Model_Produit();
					$produit = $produit->getByCodeBarres($codebar);
					echo "add_vente(".$produit->getIdProduit().");";
					echo "codebar = '';";
				}
				catch(Zend_Exception $f)
				{
					if(!$vente_login)
					{
						echo "alert('Code Barres inconnu : ".$codebar."');";
					}
				}
			}
		}
	}

}